import routes from '@/router/routes'

/**
 * @param {Array} target 目标数组
 * @param {Array} arr 需要查询的数组
 * @description 判断要查询的数组是否至少有一个元素包含在目标数组中
 */
export const hasOneOf = (targetarr, arr) => {
  return targetarr.some(_ => arr.indexOf(_) > -1)
}

/**
 * @param {*} access 用户权限数组，如 ['super_admin', 'admin']
 * @param {*} route 路由列表
 */
const hasAccess = (access, route) => {
  if (route.meta && route.meta.access) return hasOneOf(access, route.meta.access)
  else return true
}

/**
 * 权鉴
 * @param {*} name 即将跳转的路由name
 * @param {*} access 用户权限数组
 * @param {*} routes 路由列表
 * @description 用户是否可跳转到该页
 */
export const canTurnTo = (name, access, routes) => {
  const routePermissionJudge = (list) => {
    return list.some(item => {
      if (item.children && item.children.length) {
        return routePermissionJudge(item.children)
      } else if (item.name === name) {
        return hasAccess(access, item)
      }
    })
  }

  return routePermissionJudge(routes)
}

/**
 * 从静态路由表中获取所有菜单
 */
export const getAllMenuFromRoutes = () => {
  var getAccessList = (arrs) => {
    var arr = []
    arrs.forEach(item => {
      var tempItem = {}
      // 如果有元数据，并且元数据中存在权限数组，则准备将其处理
      if (item.meta && item.meta.access) {
        tempItem.title = item.meta.title ? item.meta.title : item.name
        tempItem.name = item.name
        tempItem.access = item.meta.access

        if (item.children && item.children.length > 0) {
          tempItem.children = getAccessList(item.children)
        }

        arr.push(tempItem)
      }
    })
    return arr
  }

  return getAccessList(routes)
}

/**
 * 从静态路由表中获取所有菜单
 */
export const getAllRoutes = () => {
  return routes
}

/**
 * @description 从静态路由表中获取所有权限名称
 */
export const getAllAccessName = () => {
  var menuList = getAllMenuFromRoutes()

  // 扁平化函数
  var getFlatArr = (list) => {
    var arr = []
    list.forEach(item => {
      arr = arr.concat(item.access)
      if (item.children && item.children.length > 0) {
        arr = arr.concat(getFlatArr(item.children))
      }
    })
    return arr
  }

  var arrs = getFlatArr(menuList)

  return arrs
}
